package evol;

import java.util.ArrayList;
import java.util.Collections;

import ia.battle.camp.FieldCell;
import ia.battle.camp.FieldCellType;
import ia.battle.camp.Move;

public class WarriorMoveA extends Move {
	private ArrayList<Nodo> procesadas = new ArrayList<Nodo>();
	private ArrayList<Nodo> sinProcesar = new ArrayList<Nodo>();
	private ArrayList<FieldCell> camino;
	private Nodo start, goal;

	public void setDestino(FieldCell a, FieldCell b) {
		this.start = new Nodo(a, null);
		this.goal = new Nodo(b, null);
		if (goal.getFc().getFieldCellType() == FieldCellType.BLOCKED) {
			System.out.println("El objetivo es un bloqueado");
		}
		sinProcesar.add(start);
		while (sinProcesar.size() > 0) {	//este while podria ser 1??
			Nodo current = sinProcesar.get(0);
			//busco el de menor f;
			for (Nodo nodo : sinProcesar) {		
				if (nodo.getF() < current.getF()) {
					current = nodo;
				}
			}

			// Chequeo si llegue a destino
			if (current.getFc() == goal.getFc()) {
				camino = reconstruct(current);
				break;		//termine???
			}
			// procesamos
			for (Nodo nodo : current.getAdj()) {
				// paso al siguiente si ya la procese o si es un obstaculo
				if (procesadas.contains(nodo) || nodo.getFc().getFieldCellType() == FieldCellType.BLOCKED) {
					continue;
				}
				nodo.getF(estimado(nodo, goal),current);
				sinProcesar.add(nodo);
			}
			procesadas.add(current);
			sinProcesar.remove(current);
		}

	}

	private ArrayList<FieldCell> reconstruct(Nodo current) {
		// TODO Auto-generated method stub
		Nodo c = current;
		ArrayList<FieldCell> lista = new ArrayList<FieldCell>();
		while(c.getPadre() != null){
			lista.add(c.getFc());
			c = c.getPadre();
		}
		Collections.reverse(lista);
		return lista;
	}

	@Override
	public ArrayList<FieldCell> move() {
		// TODO Auto-generated method stub
		return camino;
	}

	private int estimado(Nodo start, Nodo goal) {
		int dx = goal.getFc().getX() - start.getFc().getX();
		int dy = goal.getFc().getY() - start.getFc().getY();
		return (Math.abs(dx) * 10) + (Math.abs(dy) * 10);
	}

}
